package br.com.vantagensaki.utils.generics.impl;

import br.com.vantagensaki.utils.exception.InfraestruturaException;
import br.com.vantagensaki.utils.exception.ObjetoNaoEncontradoException;
import java.io.Serializable;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;

public class HibernateDaoGenericoCustomizado<T, PK extends Serializable>
        extends HibernateDaoGenerico<T, PK> {

    private HibernateTemplate ht = null;

    public HibernateDaoGenericoCustomizado(Class<T> tipo) {
        super(tipo);
        this.ht = super.getHibernateTemplate();
    }

    public List<T> buscarLista(String query, Object... argumentos) {

        List<T> list = null;
        try {

            this.ht = super.getHibernateTemplate();
            if (argumentos == null) {
                list = ht.find(query);

            } else {
                list = ht.find(query, argumentos);
            }

        } catch (Exception e) {
            throw new InfraestruturaException(e);
        }

        return (List<T>) list;
    }

    public T buscar(String query, Object... argumentos) throws ObjetoNaoEncontradoException {

        List<T> list = this.buscarLista(query, argumentos);

        if (list == null || list.isEmpty()) {
            throw new ObjetoNaoEncontradoException();
        }

        return list.get(0);
    }

//    public Set<T> buscarConjunto(Method metodo, Object[] argumentos, String nomeQuery) {
//        HibernateTemplate ht = getHibernateTemplate();
//
//        try {
//            String nomeDaBusca = getNomeDaBuscaPeloMetodoENomeQuery(metodo, nomeQuery);
//
//            List<T> list = ht.findByNamedQuery(nomeDaBusca, argumentos);
//
//            return new LinkedHashSet(list);
//        } catch (Exception e) {
//            throw new InfraestruturaException(e);
//        }
//
//    }
//    private String[] montaArrayArgumentosHQL(Object[] argumentos) {
//        String [] args = new String[argumentos.length];
//        for (int i = 0; i < argumentos.length; i++) {
//            args[i] = "$" + (i + 1);
//        }
//        return args;
//    }
}
